package com.example.demo.entity;

import com.example.demo.tools.PinyinTools;
import lombok.Data;

import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Objects;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-30
 * Time: 10:01
 */
@Data
public class FileMeta {
    private int id; // 自增主键 id
    private String name; // 文件名
    private String path; // 文件路径
    private boolean isDirectory; // 是否为目录

    // pinyin  和 pinyin_first 可以根据 path 来获取
//    private String pinyin; //
//    private String pinyin_first;

    private long size; // 单位为字节
    private long lastModify; // 最后修改时间, 一个非常大的时间戳数字,需要格式化

    // 获取全拼
    public String getPinyin() {
        return PinyinTools.get(name, true);
    }

    // 获取首字母拼音
    public String getPinyinInFirst() {
        return PinyinTools.get(name, false);
    }


    // 转换文件内存大小
    public String getSizeText() {
        // 将字节为单位的换算成 Byte KB MB GB 等等
        // 以 1024 为基准, size < 1024 为 Byte
        // size >= 1024时, size 应该为 1.0001 MB, 单位由 byte 升级到 MB

        double curSize = size;
        String[] units = {"Byte", "KB", "MB", "GB"};

        for(int level = 0; level < units.length; level++) {
            if(curSize < 1024) {
                // format 进行格式化输出设置. BigDecimal 更加精准的小数计算
                return String.format("%.2f " + units[level], new BigDecimal(curSize));
            }

            curSize /= 1024;
        }

        // 超过了 GB 仍然不够, 出现 TB 情况. 但依然采取 GB 换算表示
        return String.format("%.2f GB" + new BigDecimal(curSize));
    }

    public String getLastModifyText() {
        // 格式化 timestamp 时间
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(lastModify);
    }

    public FileMeta(String name, String path, boolean is_directory, long size, long lastModify) {
        this.name = name;
        this.path = path;
        this.isDirectory = is_directory;
        this.size = size;
        this.lastModify = lastModify;
    }

    // 提供一个由真实文件构造的 FileMeta 对象
    public FileMeta(File file) {
        this(file.getName(), file.getPath(), file.isDirectory(), file.length(), file.lastModified());
    }

    public boolean isDirectory() {
        return isDirectory;
    }

    @Override
    public boolean equals(Object o) {

        // 自己和自己比较
        if (this == o) return true;

        // 比较类型是否一致
        if (o == null || getClass() != o.getClass()) return false;

        FileMeta fileMeta = (FileMeta) o;

        // 根据文件名 文件路径 和是否为文件进行判断比较
        return name.equals(fileMeta.name) && path.equals(fileMeta.path) && isDirectory == fileMeta.isDirectory;
    }

    // 如果两个对象 equals 相比为 true , 此时他们的 hashcode 也应该相同
    @Override
    public int hashCode() {
        return Objects.hash(name, path, isDirectory);
    }
}
